package pe.edu.sistemas.sisdiho.controller;

import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.primefaces.context.RequestContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.DisabledException;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;

import pe.edu.sistemas.sisdiho.entities.Mailing;
import pe.edu.sistemas.sisdiho.entities.User;
import pe.edu.sistemas.sisdiho.services.LoginService;
import pe.edu.sistemas.sisdiho.services.UserScheduleService;

@Controller
@Scope("session")
public class LoginScheduleController {
	private User usuario = null;
	private String codigo = null;
	private String password = null;
	private String rememberMe = null;
	private String nombreUsuario=null;
	private List<String> roles = null;
	private boolean tieneRoles = false;
	private boolean administrador = false;
	private boolean operador = false;
	private boolean atencionDocente = false;
	private boolean soporteTecnico = false;
	private boolean decano=false;
	/************ 29-03 *************/
	private String usuarioRecuperar;
	private Mailing mailer=new Mailing("NOTIFICACIONES.SISDIHO@gmail.com","@SISDIHOF1S1");
	private boolean usuarioExiste;
	/************ 29-03 *************/
	
	@Autowired
	private LoginService loginService;
	@Autowired
	private UserScheduleService userService;
	private Log log = LogFactory.getLog(LoginScheduleController.class);
	
	
	
	public LoginScheduleController() {
		usuarioRecuperar = "";
		
	}

	public String login() {
		String res = "error";
		try {
			if (loginService.login(codigo, userService.MD5(password), rememberMe)) {
				System.out.println("usuario dif nul : " + codigo);
				List<User> roles_user = userService
						.obtenerUsuarioxCodSistema(codigo);
				roles = new ArrayList<String>();
				for (User usu : roles_user) {
					roles.add(usu.getAuthority());
					usuario = usu;
				}
				nombreUsuario = userService.obtenerNombreUsuario( usuario.getId_persona() );
				tieneRoles = false;
				if(roles.size()>1){
					tieneRoles = true;
				}
				validarRoles();
				res ="";
			}
		} catch (DisabledException e) {
			e.printStackTrace();
			FacesContext context = FacesContext.getCurrentInstance();
			context.addMessage("mensajes", new FacesMessage(
					FacesMessage.SEVERITY_WARN, "Usuario deshabilitado", null));
		} catch (BadCredentialsException e) {
			e.printStackTrace();
			codigo = "";
			FacesContext context = FacesContext.getCurrentInstance();
			context.addMessage("mensajes", new FacesMessage(
					FacesMessage.SEVERITY_ERROR,
					"Usuario o password incorrecto", null));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return res;
	}

	private void validarRoles() {
		administrador = false;
		operador = false;
		atencionDocente = false;
		soporteTecnico = false;
		decano=false;
		
		for (String rol : roles) {
			if (rol.equalsIgnoreCase("ADMINISTRADOR")) {
				setAdministrador(true);
			} else if (rol.equalsIgnoreCase("OPERADOR")) {
				setOperador(true);
			} else if (rol.equalsIgnoreCase("ATENCION DOCENTE")) {
				setAtencionDocente(true);
			} else if (rol.equalsIgnoreCase("SOPORTE TECNICO")) {
				setSoporteTecnico(true);
			} else if (rol.equalsIgnoreCase("DECANO")){
				setDecano(true);
			}else if (rol.equalsIgnoreCase("SISDIHO-CEUPS")) {
				setOperador(true);
			}else if (rol.equalsIgnoreCase("SISDIHO-UPG")) {
				setOperador(true);
			}
		}
		
		System.out.println("REDIRECCIONANDO.....");
		try {
			FacesContext
					.getCurrentInstance()
					.getExternalContext()
					.redirect(					
							"/sisdiho/redireccionSchedule.jsf");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public void volverRol()
	{
		try {
			FacesContext
					.getCurrentInstance()
					.getExternalContext()
					.redirect(					
							"/sisdiho/redireccionSchedule.jsf");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public String logout() {
		String res = "error";
		try {
			loginService.logout();
			res = loginService.irLogin();
			codigo = null;
		} catch (Exception e) {
			log.info("loginService = " + res);
		}
		return res;
	}
	
	public void enviarPassword(){
		usuarioExiste = false;
		System.out.println("Boton si reacciona");
		if (true) { //Si existe usuario
			String emailPeticion = "";
			//emailEncargado=peticionService.obtenerEmailMagna();
			emailPeticion = "jvasqueze33@gmail.com";
			
			//aQUI SE OBTIENE LA CLAVE y se desencripta
			String passwordSolicitado="pass_solicitado";
			
			mailer.EnviarCorreo(emailPeticion, "Solicitud de contraseña","Usted solicito su clave de acceso a SISDIHO. Su clave es: "+passwordSolicitado);
			usuarioExiste = true;
			this.setUsuarioRecuperar("");
			FacesContext context = FacesContext.getCurrentInstance();
			context.addMessage("growl", new FacesMessage(
					FacesMessage.SEVERITY_INFO,
					"Su contraseña ha sido enviada a su e-mail.", null));
		}
		else{
			FacesContext context = FacesContext.getCurrentInstance();
			context.addMessage("growl", new FacesMessage(
					FacesMessage.SEVERITY_ERROR,
					"Usuario no existe", null));
			
		}
		
		
		
		
		
    }
	
	public void limpiarUsuarioRec(){
		usuarioRecuperar = "";
		System.out.println("Usuario: "+usuarioRecuperar);
	}
	
	
	
	public boolean isUsuarioExiste() {
		return usuarioExiste;
	}

	public void setUsuarioExiste(boolean usuarioExiste) {
		this.usuarioExiste = usuarioExiste;
	}

	public String getUsuarioRecuperar() {
		return usuarioRecuperar;
	}

	public void setUsuarioRecuperar(String usuarioRecuperar) {
		this.usuarioRecuperar = usuarioRecuperar;
	}

	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getRememberMe() {
		return rememberMe;
	}

	public void setRememberMe(String rememberMe) {
		this.rememberMe = rememberMe;
	}

	public List<String> getRoles() {
		return roles;
	}

	public void setRoles(List<String> roles) {
		this.roles = roles;
	}

	public boolean isAdministrador() {
		return administrador;
	}

	public void setAdministrador(boolean administrador) {
		this.administrador = administrador;
	}

	public boolean isOperador() {
		return operador;
	}

	public void setOperador(boolean operador) {
		this.operador = operador;
	}

	public boolean isAtencionDocente() {
		return atencionDocente;
	}

	public void setAtencionDocente(boolean atencionDocente) {
		this.atencionDocente = atencionDocente;
	}

	public boolean isSoporteTecnico() {
		return soporteTecnico;
	}

	public void setSoporteTecnico(boolean soporteTecnico) {
		this.soporteTecnico = soporteTecnico;
	}
	public boolean isTieneRoles() {
		return tieneRoles;
	}

	public void setTieneRoles(boolean tieneRoles) {
		this.tieneRoles = tieneRoles;
	}

	public boolean isDecano() {
		return decano;
	}

	public void setDecano(boolean decano) {
		this.decano = decano;
	}

	public String getNombreUsuario() {
		return nombreUsuario;
	}

	public void setNombreUsuario(String nombreUsuario) {
		this.nombreUsuario = nombreUsuario;
	}
	
}
